package com.zjj.jvm.reference;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

/**
 * @author zhanglei.zjj
 * @description 演示弱引用的使用，弱引用和引用队列联合使用
 * @date 2023/3/14 8:52
 */
public class TestWeakReference {
    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        WeakReference<Object> weakReference = new WeakReference<>(o);

        // 强行删除强引用
        o = null;

        // 删除强引用
        System.out.println("gc 前的弱引用: " + weakReference.get());

        // 手动调用gc
        System.gc();

        System.out.println("gc 后的强引用: " + o);
        System.out.println("gc 后的弱引用: " + weakReference.get());

        /**
         * 弱引用也可以一个引用队列联合使用，如果弱引用中的对象被回收，那么弱引用会被加到关联的引用队列中
         */
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        Object obj = new Object();
        WeakReference<Object> weakReference1 = new WeakReference<>(obj, queue);

        // 删除强引用
        obj = null;

        System.gc();
        // 如果obj被回收，弱引用进入引用队列
        Reference<?> reference = queue.remove();
        System.out.println("queue poll reference" + reference);
    }
}
